function grdecl=scan_GRDECL(filename,grdecl)
% 输入角点网格的文本文件名filename
% clear;close all;fclose all;clc
% filename='刘家沟组地质模型数据.GRDECL';
% filename='刘家沟截取.GRDECL'

[fid, errmsg]=fopen(filename,'r');% 打开文本文件
if fid==-1
    error('指定的文件%s无法打开\n错误信息：%s',filename,errmsg)
end
frewind(fid);% 将文件位置指示符移至所打开文件的开头
extractcell = @(c) c{1};


if nargin<2
    grdecl=struct();

    % kwi=1;
    while ~feof(fid)
        line_ex = fgetl(fid);% fgetl：读取文件中的行，并删除换行符
        if line_ex==-1
            msg = ferror(fid);
            fclose(fid);
            error('您提供的文件为空，请检查您输入的文件名\n错误消息：%s\n',msg)
        end

        keywd = regexp(line_ex, '^[A-Z][A-Z0-9]{0,11}(|/)', 'match', 'once');
        while isempty(keywd) && ~feof(fid)
            line_ex = fgetl(fid);
            if line_ex ~= -1
                keywd = regexp(line_ex, '^[A-Z][A-Z0-9]{0,7}(|/)', 'match', 'once');
            end
        end

        if ~isempty(keywd)
            switch keywd
                case {'MAPUNITS'}
                    grdecl.MAPUNITS = extractcell(extractcell(textscan(fid, '%[^/]')));
                    % textscan(fid, '%[^/]')从文件中读取直到遇到 / 为止的所有字符，并跳过 / 不读入。
                    % textscan 函数会返回一个包含读取结果的单元数组
                case {'MAPAXES'}
                    grdecl.MAPAXES = extractcell(textscan(fid, '%f'));
                    % textscan(fid, '%f') 的作用是从文件中读取所有的浮点数，返回一个单元数组，里面的内容是所读取的浮点数。
                    % 如果文件包含多行浮点数数据，textscan 会将这些数据读取成一列数据的形式。
                case {'GRIDUNIT'}
                    grdecl.GRIDUNIT = extractcell(extractcell(textscan(fid, '%[^/]')));
                case {'SPECGRID', 'DIMENS'}
                    SPECGRID = extractcell(textscan(fid, '%f', 3));
                    grdecl.SPECGRID=SPECGRID;
                    fgetl(fid);
                    grdecl.cartDims = reshape(grdecl.SPECGRID, 1, []);
                case {'COORDSYS'}
                    grdecl.COORDSYS = extractcell(textscan(fid, '%f'));
                case {'COORD'}
                    numcoord=prod(grdecl.SPECGRID(1:2)+1)*3*2;
                    vecfina=scan_data(fid,numcoord,ftell(fid));
                    grdecl.COORD=vecfina;
                case {'ZCORN'}
                    numzcorn=prod(SPECGRID)*8;
                    vecfina=scan_data(fid,numzcorn,ftell(fid));
                    grdecl.ZCORN=vecfina;
                case {'ACTNUM','PORO','PERMEABILITY', 'PERMX' , 'PERMXY', 'PERMXZ', ...
                        'PERMYX', 'PERMY' , 'PERMYZ', ...
                        'PERMZX', 'PERMZY', 'PERMZ' , ...
                        'PERMH', 'SATNUM', 'ROCKTYPE', ...
                        'MULTX' , 'MULTX-', ...
                        'MULTY' , 'MULTY-', ...
                        'MULTZ' , 'MULTZ-', ...
                        'NTG'   , 'VSH' ,'YOUNGMOD','POISSONR'}
                    nn=prod(SPECGRID);
                    vecfina=scan_data(fid,nn,ftell(fid));
                    grdecl.(keywd) = vecfina;
                otherwise

            end
        end

        % kw{kwi,1}=keywd;
        % kw{kwi,2}=ftell(fid);
        % kwi=kwi+1;
    end
    % kw = kw(~cellfun('isempty',kw(:,1)),:);

    if isfield(grdecl, 'ACTNUM')
        grdecl.ACTNUM = int32(grdecl.ACTNUM);
    end
    status = fclose(fid);
    if status == -1
        error('关闭文件时出错\n')
    end
else
    while ~feof(fid)
        line_ex = fgetl(fid);% fgetl：读取文件中的行，并删除换行符
        if line_ex==-1
            msg = ferror(fid);
            fclose(fid);
            error('您提供的文件为空，请检查您输入的文件名\n错误消息：%s\n',msg)
        end

        keywd = regexp(line_ex, '^[A-Z][A-Z0-9]{0,11}(|/)', 'match', 'once');
        while isempty(keywd) && ~feof(fid)
            line_ex = fgetl(fid);
            if line_ex ~= -1
                keywd = regexp(line_ex, '^[A-Z][A-Z0-9]{0,7}(|/)', 'match', 'once');
            end
        end

        if ~isempty(keywd)
            switch keywd
                case {'YOUNGMOD','POISSONR' }
                    nn=prod(grdecl.SPECGRID);
                    vecfina=scan_data(fid,nn,ftell(fid));
                    grdecl.(keywd) = vecfina;
                otherwise

            end
        end
    end
    status = fclose(fid);
    if status == -1
        error('关闭文件时出错\n')
    end

end

end
